package com.zwh.rabbitmq.basic.queue;

import java.util.HashMap;
import java.util.Map;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.zwh.rabbitmq.basic.exchange.DirectExchangeConfig;

/**
 * 在没有方法内定义交换机bean时，
 * 第二种定义队列，且绑定交换机的方式
 * @author zwh
 * @date 2022/1/21 16:59
 **/
@Configuration
public class DirectQueueConfig {

    /**
     * 获取直连交换机的bean， 根据bean名称获取
     */
    @Autowired
    @Qualifier(DirectExchangeConfig.TEST_DIRECT_EXCHANGE)
    private DirectExchange testDirectExchange;

    /**
     * 声明直连队列的bean， 该bean名称为：testDirectQueue2
     * @return
     */
    @Bean
    public Queue testDirectQueue2() {
        // 默认 this(name, true, false, false)
        // Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
        Queue queue = new Queue(DirectExchangeConfig.DIRECT_QUEUE2);

        // 消息的最大存活时间，单位毫秒， 当超过时间后消息会被丢弃
        queue.addArgument("x-message-ttl", 10);
        // 队列过期时间，当auto delete设置为true时,才生效
        queue.addArgument("x-expires", 10);

        // 队列存放最大就绪消息数量，超过限制时，从头部丢弃消息
        queue.addArgument("x-max-length", 6);
        // 队列存放的所有消息总大小，超过限制时，从头部丢弃消息
        queue.addArgument("x-max-length-bytes", 1024 * 1024);
        return queue;
    }

    /**
     * 将声明的队列绑定到直连交换机， 绑定的路由key routeKey为队列名称
     * @return
     */
    @Bean
    public Binding testDirectQueue2Binding(){
        return BindingBuilder.bind(testDirectQueue2()).to(testDirectExchange).with(DirectExchangeConfig.DIRECT_QUEUE2);
    }
}
